Vim 中设置 tab 自动转换为 4 个空格

文章目录
  1. 1. 设置方法
    1. 1.1. filetype 命令说明
      1. 1.1.1. 作用
  2. 2. commands 命令具体说明
    1. 2.1. tabstop
    2. 2.2. softtabstop
    3. 2.3. expandtab
    4. 2.4. shiftwidth
    5. 2.5. 综合
  3. 3. 参考

设置方法

.vimrc 文件(没有就在 $HOME 下新建一个)中设置[1]

1
2
3
4
5
6
7
8
9
filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" Sets the number of columns for a TAB
set softtabstop=4
" On pressing tab, insert 4 spaces
set expandtab

另一个回答附有有更通俗的注释[2]

1
2
3
4
5
6
7
8
9
10
11
filetype plugin indent on
set tabstop=4 " The width of a TAB is set to 4.
" Still it is a \t. It is just that
" Vim will interpret it to be having
" a width of 4.

set shiftwidth=4 " Indents will have a width of 4

set softtabstop=4 " Sets the number of columns for a TAB

set expandtab " Expand TABs to spaces

filetype 命令说明

文档说明[3][4]

1
filetype plugin indent on

这行命令主要是用于开启文件类型检测

作用

vim通过对文件类型的识别,可以为不同类型的文件,设置不同的选项值、定义不同键绑定等。例如,对于c类型的文件,它就和bash脚本有不同的注释格式、不同的缩进格式、不同的关键字等。vim在设置文件类型后,会触发FileType事件,执行FileType相关的自动命令,对不同类型的文件区别对待。[5]

commands 命令具体说明

以下列出了设置时需要使用的命令的说明:tabstop, shiftwidth, expandtab, 和 softtabstop

tabstop

Set tabstop to tell vim how many columns a tab counts for.[6]

tabstop 设置 vim 中每个 tab 展开的列数

softtabstop

Set softtabstop to control how many columns vim uses when you hit Tab in insert mode.[6:1]

顾名思义,softtabstoptabstop 的 soft 版本

expandtab

When expandtab is set, hitting Tab in insert mode will produce the appropriate number of spaces.[6:2]

对 expandtab 进行设置后,点击 tab 就会将其转换为对应数量的空格

shiftwidth

Set shiftwidth to control how many columns text is indented with the reindent operations (<< and >>) and automatic C-style indentation.[6:3]

综合

设置情况 Vim 行为
softtabstop < tabstopexpandtab 没有设置 混合使用 tab 和 space 来生成期望的 spacing
softtabstop = tabstopexpandtab 没有设置 总是使用 tab
设置了 expandtab 总是使用 空格

可以看到,我们应该设置 expandtab,以让 Vim 自动将 tab 转换成对应的空格

参考


  1. whitespace - Tab key == 4 spaces and auto-indent after curly braces in Vim - Stack Overflow ↩︎

  2. vim - Redefine tab as 4 spaces - Stack Overflow ↩︎

  3. indentation - What is the difference between filetype plugin indent on and filetype indent on? - Vi and Vim Stack Exchange ↩︎

  4. Vim documentation: filetype (英)VIM: filetype(中) ↩︎

  5. vi/vim使用进阶: 开启文件类型检测 – 易水博客 ↩︎

  6. Secrets of tabs in vim ↩︎ ↩︎ ↩︎ ↩︎